#include "func_rm.h"

void rm_r(const char *pathname);
int func_rm(int peerfd, char *pathname)
{
    char safepathname[1024] = {0};
    sprintf(safepathname, "%s/%s", ".", pathname);
    int retval = 0; //判断返回值
    /*const char *pathname = argv[1]; //测试用
    int peerfd = 1;//测试用*/
    struct stat s_buf;//存储stat()获取的文件信息
    stat(safepathname, &s_buf);//调用stat()
    perror("stat");

    if(S_ISDIR(s_buf.st_mode)) {//判断文件类型 若是 DIR
        rm_r(safepathname);//递归删除目录下的文件
        retval = remove(safepathname);//已成为空目录 直接调用remove()删除
        if(retval == -1) {//对remove()的 ERROR_CHECK
            perror("22::remove");
            return -1;
            //exit(-1);
        }
        puts("DIR Remove");//在Server端 打印提示信息
        send(peerfd, "DONE\n", strlen("DONE\n"), 0);//向 client 反馈一条消息
    }
    else if(S_ISREG(s_buf.st_mode)) {//若是 普通文件可以直接删除
        retval = remove(safepathname);//调用remove() 删除文件
        if(retval == -1) {//ERROR_CHECK
            perror("31::remove");
            return -1;
            //exit(-1);
        }
        puts("FILE Remove");//Server打印提示信息
        send(peerfd, "DONE\n", strlen("DONE\n"), 0);//反馈给client一条消息
    } else {//不是目录 也 不是普通文件 
        puts("UNEXPECTED ERROR");//报错
        send(peerfd, "UNEXPECTED ERROR\n", strlen("UNEXPECTED ERROR\n"), 0);//发送错问信息到client
        return -1;//return -1 作为错误码
    }
    return 0;
}

void rm_r(const char *pathname) {//目录的递归删除
    DIR *pdir = opendir(pathname);//打开目录
    if(pdir == NULL) {//ERROR_CHECK
        perror("47::opendir");
        return ;
        //exit(-1);
    }

    struct dirent *pdirent;//指向目录项的指针
    while((pdirent = readdir(pdir)) != NULL) {//从目录中逐个读取目录项
        char *name = pdirent->d_name;//获取目录项的名字
        if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {//跳过头两个  '.' '..'目录项
            continue;
        }
        
        char subpathname[512];//存储子目录项的pathname的buffer
        sprintf(subpathname, "%s/%s", pathname, name);//将上一级pathname与目录项名字拼接生成当前目录项的pathname

        if(pdirent->d_type == DT_DIR) {//若当前子目录项又是DIR
            rm_r(subpathname);//递归
            remove(subpathname);//已成为空目录所以直接删除
        } else {//说明是普通文件
            int ret = 0;//返回值校验
            ret = remove(subpathname);//调用remove()删除文件
            if(ret == -1) {//ERROR_CHECK
                perror("68::remove");
                return ;
                //exit(-1);
            }
        }
    }
}

